package com.ynwt.controller;

import com.github.sd4324530.fastweixin.api.CustomAPI;
import com.github.sd4324530.fastweixin.message.BaseMsg;
import com.github.sd4324530.fastweixin.message.TextMsg;
import com.github.sd4324530.fastweixin.message.req.*;
import com.ynwt.constant.MenuKey;
import com.ynwt.constant.ReplyMsgKeyword;
import com.ynwt.repository.UserDao;
import com.ynwt.service.*;
import com.ynwt.test.TestServiceImpl;
import com.ynwt.support.YWeixinControllerSupport;
import com.ynwt.thread.SendQrcodeImgThread;
import com.ynwt.thread.TotalYcoinRankThread;
import com.ynwt.thread.WeekYcoinRankThread;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by huangying on 2017/4/26.
 */
@RestController
@RequestMapping("/weixin")
public class WeixinController extends YWeixinControllerSupport {

    @Value("${weixin.token}")
    private String token;
    @Value("${weixin.appID}")
    private String appID;
    @Value("${weixin.appsecret}")
    private String appsecret;
    @Value("${weixin.aesKey}")
    private String aesKey;

    //设置TOKEN，用于绑定微信服务器
    @Override
    protected String getToken() {
        return token;
    }


    //使用安全模式时设置：APPID
    //不再强制重写，有加密需要时自行重写该方法
    @Override
    protected String getAppId() {
        return appID;
    }

    //使用安全模式时设置：密钥
    //不再强制重写，有加密需要时自行重写该方法
    @Override
    protected String getAESKey() {
        return aesKey;
    }

    /**
     * 预处理程序
     * 用户所有与微信的交互，都先走这里
     * @param fromUserName
     * @param eventType
     */
    @Override
    protected void preProcessHandle(String fromUserName, String eventType) {

        //如果不是关注事件，走预处理程序，否则在关注事件中处理
        if (!EventType.SUBSCRIBE.equals(eventType)) {

            //判断是否成为环球小伙伴，如果没有成为环球小伙伴，则注册成为环球小伙伴。
            if (!eventService.isSubscribe(fromUserName)) {
                eventService.regHuanQiuXiaoHuoBan(fromUserName);
            }
            //判断参数二维码是否过期（如果没有参数二维码，会自动生成）
            //todo 去掉参数二维码
//            if (!eventService.isQrcodeLegal(fromUserName)) {
//                threadPoolTaskExecutor.execute(applicationContext.getBean(RefreshQrcodeThread.class).setOpenid(fromUserName));
//            }
        }
    }

    /**
     * 重写父类方法，处理对应的微信消息
     * @param msg 请求消息对象
     * @return
     */
    @Override
    protected BaseMsg handleTextMsg(TextReqMsg msg) {
        String content = msg.getContent().trim();
        String openid = msg.getFromUserName();

        if ("周逸贝排行榜".equals(content)) {
            threadPoolTaskExecutor.execute(weekYcoinRankThread.setOpenid(openid));
        } else if ("hh".equals(content)) {
            testService.qiniu(openid);
        } else if ("逸贝排行榜".equals(content)) {
            threadPoolTaskExecutor.execute(totalYcoinRankThread.setOpenid(openid));
        } else if ("签到".equals(content)) {
            msgService.sendSignResult(openid);
        } else if ("刷新我的信息".equals(content)) {
            userService.updateUserInfo(openid);
            if (userService.updateUserInfo(openid)) {
                return new TextMsg("刷新信息成功！");
            }
        } else if ("我的邀请卡".equals(content)) {
            qrcodeService.getInvitationCard(openid);
        } else if ("签到排行榜".equals(content) || "月签到排行榜".equals(content)) {
            return new TextMsg("亲爱的环球小伙伴，【环球小伙伴】小程序正在开发中，使用【环球小伙伴】小程序可以查询签到相关的各种排行榜，敬请期待～");
        } else if ("我的邀请卡".equals(content)) {
            String reMsg = "紧急通知：\n" +
                    "\n" +
                    "<a href=\"http://mp.weixin.qq.com/s/se1lrPRqvZdEx80ZEW1K2A\">云逸团队将于本周对逸贝系统的”我的邀请卡“功能进行重大升级，于2017年5月30日10：30分后暂停新的邀请卡获取，也就是所有环球小伙伴将无法获得新的专属邀请卡，原先邀请卡在邀请好友扫码时可能会出现逸贝不增长的情况。建议所有环球小伙伴暂停”邀请好友赚逸贝“这一方式赚逸贝。</a>\n" +
                    "\n" +
                    "<a href=\"http://mp.weixin.qq.com/s/se1lrPRqvZdEx80ZEW1K2A\">”我的邀请卡“功能恢复的具体时间将通过公众号推文通知。升级期间，大家依然可以通过”转群传播公益“快速赚逸贝，逸贝正常可以在逸贝商城自由兑换商品。</a>\n" +
                    "\n" +
                    "<a href=\"http://mp.weixin.qq.com/s/se1lrPRqvZdEx80ZEW1K2A\">为了让环球小伙伴更加快速的赚取逸贝，同时为了避免网络拥挤，从2017年5月30日起，每天上传群截图的数量由原先的8个提高到24个，但必须是0:00-12:00；12:00-18:00；18:00-24：00三个时段分别8个，否则不予通过。</a>\n" +
                    "\n" +
                    "<a href=\"http://mp.weixin.qq.com/s/se1lrPRqvZdEx80ZEW1K2A\">赶紧点击这里快速赚逸贝获取2018肖秀荣1000题吧！</a>";
            return new TextMsg(reMsg);
        } else if (ReplyMsgKeyword.MY_YCOIN.equals(content)) {
            msgService.sendQueryYcoinReplyMsg(openid);
        } else {
            msgService.autoReply(openid, msg.getContent());
            return null;
        }


        /* todo 去掉测试用代码
        if ("aa".equals(content)) {
            rankService.weekYcoinRank(openid, 0L , 5L);
//            testService.sign(openid);
//            eventService.refreshQrcode(openid);
        } else if ("bb".equals(content)) {
            rankService.totalYcoinRank(openid, 0L, 10L);
//            testService.time();
        } else if ("cc".equals(content)) {
            testService.sign2(openid);
//            eventService.sign(openid);
        } else if ("cc".equals(content)) {
            return new TextMsg(userDao.findOne(openid).getNickname());
        } else if ("dd".equals(content)) {
//            new SendQrcodeImageThread(openid, msgService).start();
            System.out.println("sendQrcodeImgThread.hashCode()===" + sendQrcodeImgThread.hashCode());
            System.out.println("threadPoolTaskExecutor.hashCode()===" + threadPoolTaskExecutor.hashCode());
            System.out.println("openid===" + openid);

            sendQrcodeImgThread.setOpenid(openid);
            threadPoolTaskExecutor.execute(sendQrcodeImgThread);
            return new TextMsg("邀请卡发送中。。。");

        } else if ("ddd".equals(content.trim())) {
            testService.qrcode(openid);
        } else if ("周逸贝排行榜".equals(content)) {
            threadPoolTaskExecutor.execute(weekYcoinRankThread.setOpenid(openid));
            return new TextMsg("查询中。。。");
        } else if ("逸贝排行榜".equals(content)) {
            threadPoolTaskExecutor.execute(totalYcoinRankThread.setOpenid(openid));
            return new TextMsg("查询中。。。");
        } else if ("签到".equals(content)) {
            eventService.sign(openid);
        } else if (ReplyMsgKeyword.MY_YCOIN.equals(content)) {
            msgService.sendQueryYcoinReplyMsg(openid);
            return null;
        }  else if ("我的邀请卡".equals(content)) {
            threadPoolTaskExecutor.execute(applicationContext.getBean(SendQrcodeImgThread.class).setOpenid(openid));
            return new TextMsg("邀请卡发送中。。。");
        } else if ("刷新我的邀请卡".equals(content)) {
            eventService.refreshQrcode(openid);
            return new TextMsg("刷新成功！");
        } else {
            msgService.autoReply(openid, msg.getContent());
        }
        */
        return null;
    }

    /**
     * 重写父类方法，处理关注事件
     * @param event 添加关注事件对象
     * @return
     */
    @Override
    protected BaseMsg handleSubscribe(BaseEvent event) {

        String openid = event.getFromUserName();

        //判断是否成为环球小伙伴，如果没有成为环球小伙伴，则注册成为环球小伙伴。
//        if (!eventService.isSubscribe(openid)) {
//            eventService.regHuanQiuXiaoHuoBan(openid);
//        }


        if (event instanceof QrCodeEvent) {//如果是扫参数二维码关注

            //判断是否成为环球小伙伴，如果没有成为环球小伙伴，则注册成为环球小伙伴。
            if (!eventService.isSubscribe(openid)) {
                eventService.regHuanQiuXiaoHuoBan(openid);
            }
            customAPI.sendCustomMessage(openid, new TextMsg("亲爱的环球小伙伴，由于系统正在进行深度升级，暂时关闭\"邀请好友奖励逸贝\"的功能，请告知你的好友哦。升级所带来的不便，我们深感抱歉"));

            /*todo 暂时不处理扫码关注
            QrCodeEvent qrCodeEvent = (QrCodeEvent) event;
//            System.out.println("哈哈哈哈哈qrCodeEvent.getEventKey() = " + qrCodeEvent.getEventKey());
            int scene = Integer.parseInt(qrCodeEvent.getEventKey().replace("qrscene_", ""));
//            System.out.println(scene);
            eventService.handleQrCodeSubscribe(openid, scene);
            */
        } else {
            //判断是否成为环球小伙伴，如果没有成为环球小伙伴，则注册成为环球小伙伴。
            if (!eventService.isSubscribe(openid)) {
                eventService.regHuanQiuXiaoHuoBan(openid);
            }
        }

        //判断参数二维码是否过期（如果没有参数二维码，会自动生成）
        //todo 去掉参数二维码
//        if (!eventService.isQrcodeLegal(openid)) {
//            threadPoolTaskExecutor.execute(applicationContext.getBean(RefreshQrcodeThread.class).setOpenid(openid));
//        }

        //发送关注欢迎语
        msgService.sendSubscribeAutoReplyMsg(openid);
        return null;
    }

    /**
     * 处理菜单点击事件，有需要时子类重写
     *
     * @param event 菜单点击事件对象
     * @return 响应消息对象
     */
    @Override
    protected BaseMsg handleMenuClickEvent(MenuEvent event) {

        String openid = event.getFromUserName();
        String key = event.getEventKey();

        if (key.equals(MenuKey.SIGN)) {//签到事件
            msgService.sendSignResult(openid);
        }

        return null;
    }



    @RequestMapping(value = "wahaha")
    String wahaha() {
        System.out.println("wahaha 我是中文的哈哈哈哈");
        return "wahaha 我是中文的哈哈哈哈";
    }

    @Autowired
    private CustomAPI customAPI;

    @Autowired
    private MsgService msgService;

    @Autowired
    private EventService eventService;

    @Autowired
    private UserService userService;

    @Autowired
    private QrcodeService qrcodeService;

    @Autowired
    private RankService rankService;

    @Autowired
    private TestServiceImpl testService;

    @Autowired
    private UserDao userDao;

    @Autowired
    private SendQrcodeImgThread sendQrcodeImgThread;

    @Autowired
    private WeekYcoinRankThread weekYcoinRankThread;

    @Autowired
    private TotalYcoinRankThread totalYcoinRankThread;

    @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;

    @Autowired
    private ApplicationContext applicationContext;
}
